package cn.jnetty.utils.create;

import cn.jnetty.api.exception.JnettyIocException;

public class ClassUtils {

	/**
	 * 使用当前线程的ClassLoader加载给定的类
	 * 
	 * @param className 类的全称
	 * @return 给定的类
	 */
	public static Class<?> loadClass(String className) {
		// ClassLoader#loadClass(String)：将.class文件加载到JVM中，不会执行static块,只有在创建实例时才会去执行static块
		try {
			return Thread.currentThread().getContextClassLoader().loadClass(className);
		} catch (ClassNotFoundException e) {}

		// Class#forName(String)：将.class文件加载到JVM中，还会对类进行解释，并执行类中的static块
		try {
			return Class.forName(className);
		} catch (ClassNotFoundException e) {}
		throw new JnettyIocException("无法加载指定类名的Class={0}",className);
	}

	/**
	 * 创建一个指定类的对象,调用默认的构造函数.
	 * 
	 * @param <T> Class
	 * @param klass 类
	 * @return 指定类的对象
	 */
	public static <T> T newInstance(final Class<T> klass) {
		try {
			return klass.newInstance();
		} catch (InstantiationException | IllegalAccessException e) {
			throw new JnettyIocException("无法加载指定类名的Class={0}",e,klass.getName());
		}
	}

	/**
	 * 尝试运行一个带有Main方法的类.
	 * 
	 * @param mainClass 带有Main方法类的名称
	 * @param args 启动参数数组
	 */
	public static void invokeMain(String mainClass, String[] args) {
		final Class<?> klass = ClassUtils.loadClass(mainClass);
//		Method mainMethod = MethodUtils.getMethod(klass, "main", String[].class);
//		MethodUtils.invoke(null, mainMethod, new Object[] { args });
	}
}